import pygame
"""
游戏初始化和退出
pygame.init() : 导入并初始化所有 pygame 模块，使用其他模块之前，必须先调用 init 方法
pygame.quit() : 卸载所有 pygame 模块，在游戏结束之前调用！
"""
#pygame.init()
#pygame.quit()


"""
坐标系
原点在左上角 (0, 0)
x轴水平方向向右，逐渐增加
y轴垂直方向向下，逐渐增加
"""


"""
Rect
在游戏中，所有可见的元素都是以矩形区域来描述位置的， pygame专门提供了一个类pygame.Rect用于描述矩形区域
Rect(x, y, width, height)
"""
# hero_rect = pygame.Rect(100, 500, 120, 126)
#
# print("坐标 %d %d" % (hero_rect.x, hero_rect.y))
# print("大小 %d %d" % (hero_rect.width, hero_rect.height))
# # size 属性会返回矩形区域的 (宽, 高) 元组
# print("大小 %d %d" % hero_rect.size)

"""
创建游戏主窗口

pygame专门提供了一个模块pygame.display用于创建、管理 游戏窗口

pygame.display.set_mode(resolution=(0,0), flags=0, depth=0)	初始化游戏显示窗口
参数:
resolution 指定屏幕的 宽 和 高，默认创建的窗口大小和屏幕大小一致
flags 参数指定屏幕的附加选项，例如是否全屏等等，默认不需要传递
depth 参数表示颜色的位数，默认自动匹配
返回值
后续所有的图像绘制都基于这个返回结果

pygame.display.update()	    刷新屏幕内容显示，稍后使用
"""
screen = pygame.display.set_mode((480, 700))

"""
图像绘制

1.在游戏中，能够看到的游戏元素大多都是图像， 图像都是保存在磁盘的, 如果需要使用, 需要加载到内存
2.使用 pygame.image.load() 加载图像的数据
3.使用 游戏屏幕 对象，调用 blit 方法 将图像绘制到指定位置
4.调用 pygame.display.update() 方法更新整个屏幕的显示
"""
# 绘制背景图像
# 1> 加载图像
# bg = pygame.image.load("./images/background.png")
#
# # 2> 绘制在屏幕
# screen.blit(bg, (0, 0))
#
# # 3> 更新显示
# pygame.display.update()

"""
游戏循环

游戏中的动画效果，本质上是快速的在屏幕上绘制图像

游戏循环的作用
1. 保证游戏 不会直接退出
2. 变化图像位置 —— 动画效果
     每隔 1 / 60 秒 移动一下所有图像的位置
     调用 pygame.display.update() 更新屏幕显示
3.检测用户交互 —— 按键、鼠标等...
"""


"""
游戏时钟

pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度 —— 刷新帧率
要使用 时钟对象 需要两步：
1）在 游戏初始化 创建一个 时钟对象
2）在 游戏循环 中让时钟对象调用 tick(帧率) 方法
tick 方法会根据 上次被调用的时间，自动设置 游戏循环 中的延时
"""
# 创建游戏时钟对象
#clock = pygame.time.Clock()
# i = 0
#
# # 游戏循环
# while True:
#
#     # 设置屏幕刷新帧率
#     clock.tick(60)
#
#     print(i)
#     i += 1

"""
动画实现
"""
# 定义英雄的初始位置
# hero_rect = pygame.Rect(150, 500, 102, 126)
#
# while True:
#
#     # 可以指定循环体内部的代码执行的频率
#     clock.tick(60)
#
#     # 更新英雄位置
#     hero_rect.y -= 1
#
#     # 如果移出屏幕，则将英雄的顶部移动到屏幕底部
#     if hero_rect.y <= 0:
#         hero_rect.y = 700
#
#     # 绘制背景图片
#     screen.blit(bg, (0, 0))
#     # 绘制英雄图像
#     screen.blit(hero, hero_rect)
#
#     # 更新显示
#     pygame.display.update()


"""
在游戏循环中监听事件
游戏启动后，用户针对游戏所做的操作, 例如：点击关闭按钮，点击鼠标，按下键盘...
在 游戏循环 中，判断用户具体的操作, 捕获到用户具体的操作，针对性的做出响应

pygame中通过 pygame.event.get() 可以获得用户当前所做动作的事件列表

# 游戏循环
while True:

    # 设置屏幕刷新帧率
    clock.tick(60)

    # 事件监听
    for event in pygame.event.get():

        # 判断用户是否点击了关闭按钮
        if event.type == pygame.QUIT:
            print("退出游戏...")

            pygame.quit()

            # 直接退出系统
            exit()

"""

"""
精灵
在游戏开发中，通常把显示图像的对象 叫做精灵Sprite
属性
    image 要显示的图像
    rect 图像要显示在屏幕的位置


精灵组
1.一个精灵组可以包含多个精灵对象
2.调用精灵组对象的update()方法, 可以自动调用组内每一个精灵的update()方法
3.调用精灵组对象的draw(屏幕对象)方法, 可以将组内每一个精灵的image绘制在rect位置


派生精灵子类
1.plane_sprites.py 文件
2.GameSprite 继承自 pygame.sprite.Sprite

import pygame
class GameSprite(pygame.sprite.Sprite):
    #游戏精灵基类
    
    def __init__(self, image_name, speed=1):
        
        # 调用父类的初始化方法
        super().__init__()
        
        # 加载图像
        self.image = pygame.image.load(image_name)
        # 设置尺寸
        self.rect = self.image.get_rect()
        # 记录速度
        self.speed = speed

    def update(self, *args):
        
        # 默认在垂直方向移动
        self.rect.y += self.speed
"""








